package com.ftg.learn.util;

import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.SignatureException;
import io.jsonwebtoken.UnsupportedJwtException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLSyntaxErrorException;

/**
 * 全局异常处理类，用来处理controller相关的处理
 * <p>
 * 如 400 500 405等
 *
 * @author kangjx
 * @createTime 2023/05/04
 */
@RestControllerAdvice
@Slf4j
public class GloabControllerAdvice {

    /**
     * 后台出错更改表以后的sql级别错误
     *
     * @param exception
     * @return
     * @throws SQLSyntaxErrorException
     */
    @ExceptionHandler(SQLSyntaxErrorException.class)
    public JsonWeb<String> handleSQLSyntaxErrorException(Exception exception) {
        JsonWeb<String> json = new JsonWeb<>();
        json.setCode(ConstUtil.SQLSYNTAXERROREXCEPTION_CODE);
        json.setMsg(ConstUtil.SQLSYNTAXERROREXCEPTION_MSG);
        json.setData(exception.getCause().toString());
        return json;
    }

    /**
     * 处理后台空指针异常
     *
     * @param exception
     * @return
     * @throws SQLSyntaxErrorException
     */
    @ExceptionHandler(NullPointerException.class)
    public JsonWeb<String> handleNullPointerException(Exception exception) {
        JsonWeb<String> json = new JsonWeb<>();
        json.setCode(ConstUtil.NULLPOINTEREXCEPTION_CODE);
        json.setMsg(ConstUtil.NULLPOINTEREXCEPTION_MSG);
        json.setData(exception.getMessage());
        return json;
    }

    /**
     * 令牌过期
     *
     * @param exception
     * @return
     * @throws SQLSyntaxErrorException
     */
    @ExceptionHandler(ExpiredJwtException.class)
    public JsonWeb<String> handleExpiredJwtException(Exception exception) {
        JsonWeb<String> json = new JsonWeb<>();
        json.setCode(ConstUtil.JWT_CODE);
        json.setMsg(ConstUtil.TOKEN_EXPIRED_MSG);
        json.setData(ConstUtil.TOKEN_EXPIRED_MSG);
        return json;
    }

    /**
     * 认证失败
     *
     * @param exception
     * @return
     * @throws SQLSyntaxErrorException
     */
    @ExceptionHandler(value = {UnsupportedJwtException.class, MalformedJwtException.class, SignatureException.class})
    public JsonWeb<String> handleJwtException(Exception exception) {
        JsonWeb<String> json = new JsonWeb<>();
        json.setCode(ConstUtil.JWT_CODE);
        json.setMsg(ConstUtil.TOKEN_INVALID_MSG);
        json.setData(exception.getMessage());
        return json;
    }

    /**
     * 参数化异常
     * @param exception
     * @return
     */
    @ExceptionHandler(value = IllegalArgumentException.class)
    public JsonWeb<String> handleIllegalArgumentException(Exception exception) {
        JsonWeb<String> json = new JsonWeb<>();
        json.setCode(ConstUtil.ILLEGAL_CODE);
        json.setMsg(ConstUtil.FAIL_INVALID_PARAM_TIP);
        json.setData(exception.getMessage());
        return json;
    }


    /**
     * 统一处理所有异常，如果有异常需要单独提示请添加相应方法
     *
     * @param exception
     * @return
     * @throws SQLSyntaxErrorException
     */
    @ExceptionHandler(Exception.class)
    public JsonWeb<String> handleException(Exception exception) {
        JsonWeb<String> json = new JsonWeb<>();
        json.setCode(ConstUtil.FAILURE_CODE);
        json.setMsg(ConstUtil.FAILURE_TIP);
        json.setData(exception.getMessage());
        return json;
    }


}